﻿//-----------------------------------------------------------------------------------------
// <copyright file="BlipService.Status.cs" company="Jakub Florczyk (www.jakubflorczyk.pl)">
//      Copyright © 2009 Jakub Florczyk (www.jakubflorczyk.pl)
//      http://blipnet.codeplex.com/
// </copyright>
//-----------------------------------------------------------------------------------------

namespace BlipNet
{
    using System;
    using System.Globalization;
    using System.IO;

    /// <summary>
    /// Blip serwis.
    /// </summary>
    public partial class BlipService
    {
        /// <summary>
        /// Zwraca ostatnie statusy bieżącego użytkownika.
        /// </summary>
        /// <param name="limit">Limit ilości.</param>
        /// <returns>Ostatnie statusy.</returns>
        public Message[] GetStatuses(int limit)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/statuses?limit={0}", limit));
        }

        /// <summary>
        /// Zwraca statusy bieżącego użytkownika nowsze od statusu o podanym id.
        /// </summary>        
        /// <param name="id">Identyfikator statusu.</param>
        /// <returns>Wszytkie statusy.</returns>
        public Message[] GetStatusesSince(int id)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/statuses/{0}/since", id));
        }

        /// <summary>
        /// Pobiera najnowsze statusy wszystkich użytkowników.
        /// </summary>        
        /// <param name="limit">Limit ilości.</param>
        /// <returns>Najnowsze statusy.</returns>
        public Message[] GetAllStatuses(int limit)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/statuses/all?limit={0}", limit));
        }

        /// <summary>
        /// Zwraca najstarsze statusy od wszystkich użytkowników nowszych od statusu o podanym id.
        /// </summary>        
        /// <param name="limit">Limit ilości.</param>
        /// <param name="id">Identyfikator statusu.</param>
        /// <returns>Najstarsze statusy.</returns>
        public Message[] GetAllStatusesSince(int limit, int id)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/statuses/{1}/all_since?limit={0}", limit, id));
        }

        /// <summary>
        /// Zwraca ostatnie statusy podanego użytkownika.
        /// </summary>        
        /// <param name="login">Login użytkownika.</param>
        /// <param name="limit">Limit ilości.</param>        
        /// <returns>Ostatnie statusy.</returns>
        public Message[] GetUserStatuses(string login, int limit)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/users/{0}/statuses?limit={1}", login, limit));
        }

        /// <summary>
        /// Zwraca statusy użytkownika nowsze od statusu o podanym id.
        /// </summary>        
        /// <param name="login">Login użytkownika.</param>
        /// <param name="id">Identyfikator wiadomości.</param>
        /// <returns>Statusy użytkownika.</returns>
        public Message[] GetUserStatusesSince(string login, int id)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/users/{0}/statuses/{1}/since", login, id));
        }

        /// <summary>
        /// Zwraca status o podanym id.
        /// </summary>        
        /// <param name="id">Identyfikator statusu.</param>
        /// <returns>Wybrany status.</returns>
        public Message GetStatus(int id)
        {
            return RequestGet<Message>(String.Format(CultureInfo.InvariantCulture, "/statuses/{0}", id));
        }

        /// <summary>
        /// Tworzy nowy status.
        /// </summary>
        /// <param name="body">Treść statusu.</param>
        public void AddStatus(string body)
        {
            this.RequestPost("/statuses", "status[body]", body);
        }

        /// <summary>
        /// Tworzy nowy status.
        /// </summary>
        /// <param name="body">Treść statusu.</param>
        /// <param name="picture">Obrazek status-u.</param>
        /// <param name="progress">Delegator postępu.</param>
        public void AddStatus(string body, Stream picture, UploadProgress progress)
        {
            this.RequestUpload("/statuses", "status[picture]", "picture.jpg", picture, progress, "status[body]", body);
        }

        /// <summary>
        /// Usuwa status o podanym id.
        /// </summary>
        /// <param name="id">Identyfikator statusu.</param>
        public void Deletetatus(int id)
        {
            this.RequestDelete(String.Format(CultureInfo.InvariantCulture, "/statuses/{0}", id));
        }

        /// <summary>
        /// Zwraca najnowsze statusy otagowanych po podanym tag-u.
        /// </summary>
        /// <param name="tag">Nazwa tag-u.</param>
        /// <param name="limit">Limit ilości.</param>
        /// <returns>Najnowsze statusy.</returns>
        public Message[] GetTagStatuses(string tag, int limit)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/tags/{0}?limit={1}", tag, limit));
        }

        /// <summary>
        /// Zwraca najnowsze statusy otagowane po podanym tag-u.
        /// </summary>
        /// <param name="tag">Nazwa tag-u.</param>
        /// <param name="limit">Limit ilości.</param>
        /// <param name="offset">Ofset ilości.</param>
        /// <returns>Najnowsze statusy.</returns>
        public Message[] GetTagStatuses(string tag, int limit, int offset)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/tags/{0}?limit={1}&offset={2}", tag, limit, offset));
        }

        /// <summary>
        /// Zwraca wszystkie statusy otagowane po podanym tag-u nowsze od statusu o podanym id.
        /// </summary>
        /// <param name="tag">Nazwa tag-u.</param>
        /// <param name="id">Identyfikator statusu.</param>
        /// <returns>Wszystkie statusy.</returns>
        public Message[] GetTagStatusesSince(string tag, int id)
        {
            return RequestGetMany<Message>(String.Format(CultureInfo.InvariantCulture, "/tags/{0}/since/{1}", tag, id));
        }        
    }
}
